ImageProvider.loadBuffer の追加
まとめ
-
ImageProvider
というメソッドが追加されましたloadBuffer
それが機能する 同様にload
からデコードする点を除いて、ui.ImmutableBuffer
。 -
ui.ImmutableBuffer
アセット キーから直接作成できるようになりました。 - の
AssetBundle
クラスがロードできるようになりましたui.ImmutableBuffer
。 - の
PaintingBinding
というメソッドが追加されましたinstantiateImageCodecFromBuffer
と同様に機能します。instantiateImageCodec
。 -
ImageProvider.load
現在は非推奨となっており、将来削除される予定です リリース。 -
PaintingBinding.instantiateImageCodec
現在は非推奨となっており、削除される予定です 将来のリリースで。
コンテクスト
ImageProvider.loadBuffer
は、次のことを行うために実装する必要がある新しいメソッドです。
画像をロードします。この API を使用すると、アセットベースの画像の読み込みを高速化できます。
アプリケーションへのメモリへの影響も少なくなります。
変更内容の説明
アセット イメージをロードする場合、以前はイメージ プロバイダー API で複数のファイルが必要でした。
圧縮されたデータのコピー。まず、アセットを開いたときのデータは、
外部ヒープにコピーされ、型付きデータ配列として Dart に公開されます。それから
その型付きデータ配列は最終的にui.ImmutableBuffer
、
これにより、デコードのためにデータが 2 番目の構造に内部的にコピーされます。
を追加して、ui.ImmutableBuffer.fromAsset
、圧縮された画像バイトは、
デコードに使用される構造体に直接ロードできます。このアプローチを使用する
のバイト読み込みパイプラインへの変更が必要ですImageProvider
。このプロセス
また、追加のスケジューリング オーバーヘッドをバイパスするため、高速になります。
以前のメソッドのチャネルベースのローダー。
ImageProvider.loadBuffer
それ以外の場合は、と同じ契約を結んでいますImageProvider.load
ただし、次のことを期待する新しいデコード コールバックを提供する点が異なります。
のui.ImmutableBuffer
の代わりにUint8List
。ためにImageProvider
クラス
アセット以外の場所からバイトを取得するコンビニエンスメソッドui.ImmutableBuffer.fromUint8List
互換性のために使用できます。
移行ガイド
サブクラス化するクラスImageProvider
を実装する必要がありますloadBuffer
の方法
アセットをロードしています。のメソッドを委任する、またはメソッドを呼び出すクラスImageProvider
直接使用する必要がありますloadBuffer
それ以外のload
。
移行前のコード:
class MyImageProvider extends ImageProvider<MyImageProvider> {
@override
ImageStreamCompleter load(MyImageProvider key, DecoderCallback decode) {
return MultiFrameImageStreamCompleter(
codec: _loadData(key, decode),
);
}
Future<ui.Codec> _loadData(MyImageProvider key, DecoderCallback decode) async {
final Uint8List bytes = await bytesFromSomeApi();
return decode(bytes);
}
}
class MyDelegatingProvider extends ImageProvider<MyDelegatingProvider> {
MyDelegatingProvider(this.provider);
final ImageProvder provider;
@override
ImageStreamCompleter load(MyDelegatingProvider key, DecoderCallback decode) {
return provider.load(key, decode);
}
}
移行後のコード:
class MyImageProvider extends ImageProvider<MyImageProvider> {
@override
ImageStreamCompleter loadBuffer(MyImageProvider key, DecoderBufferCallback decode) {
return MultiFrameImageStreamCompleter(
codec: _loadData(key, decode),
);
}
Future<ui.Codec> _loadData(MyImageProvider key, DecoderBufferCallback decode) async {
final Uint8List bytes = await bytesFromSomeApi();
final ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromUint8List(bytes);
return decode(buffer);
}
}
class MyDelegatingProvider extends ImageProvider<MyDelegatingProvider> {
MyDelegatingProvider(this.provider);
final ImageProvder provider;
@override
ImageStreamCompleter loadBuffer(MyDelegatingProvider key, DecoderCallback decode) {
return provider.loadBuffer(key, decode);
}
}
どちらの場合も、
以前の実装ImageProvider.load
コードのユーザーにも移行する時間を与えます。
タイムライン
リリースされたバージョン: 3.1.0-0.0.pre.976
安定リリース: 3.3.0
参考文献
API ドキュメント:
ImmutableBuffer
ImageProvider
関連する PR:
- アセット画像の読み込みには不変バッファを使用する